package com.tomorrow.controller;

import com.alibaba.fastjson.JSON;
import com.tomorrow.feign.UserClient;
import com.tomorrow.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserConsumerController {

    //开启Feign后均内置有RestTemplate客户端和discoveryClient客户端发现对象，
    //并内置了他们的相关操作以及负载均衡，所以相关内容直接注释
    /*@Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient; // eureka客户端，可以获取到eureka中服务的信息*/


    @Qualifier("com.tomorrow.feign.UserClient")
    @Autowired
    private UserClient userClient;
    @GetMapping("/find")
    public String findById(Integer id) {
       /* // 根据服务名称，获取服务实例。有可能是集群，所以是service实例集合
        List<ServiceInstance> instances = discoveryClient.getInstances("SERVICE-PROVIDER");
        // 因为只有一个Service-provider。所以获取第一个实例
        ServiceInstance instance = instances.get(0);

        //未负载均衡的普通调用方式
        // 获取ip和端口信息，拼接成服务地址
        //String baseUrl = "http://" + instance.getHost() + ":" + instance.getPort() + "/user/" + id;

        ////负载均衡访问服务
        //////简单的服务调用方式
        String baseUrl = "http://service-provider/user/" + id;
        User user = restTemplate.getForObject(baseUrl, User.class);*/

        //////优雅的服务调用方式
        User user = userClient.findUserById(id);

        return JSON.toJSONString(user);
    }

    /*局部熔断方法，用于局部方法的熔断处理，
     * 需要和被熔断的方法返回值相同，参数列表相同
     * 使用时在被熔断的方法前添加 @HystrixCommand(fallbackMethod = "熔断执行的方法名") 注解即可*/
    public String queryUserByIdFallBack(Integer id){
        return "局部熔断，请求繁忙，请稍后再试！";
    }

    /*全局熔断方法，用于全局方法的熔断处理
     * 仅需要返回值与全局的方法一样都为JSON字符串，参数列表为空即可*/
    public String FallBack(){
        return "全局熔断，请求繁忙，请稍后再试！";
    }
}